package com.ms.teapuesto.web;

import com.gargoylesoftware.htmlunit.Page;
import com.gargoylesoftware.htmlunit.RefreshHandler;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.*;
import com.ms.teapuesto.model.Fecha;
import com.ms.teapuesto.model.Liga;
import com.ms.teapuesto.model.Pronostico;
import com.ms.teapuesto.util.DateUtil;
import com.ms.teapuesto.util.HtmlUtil;
import com.ms.teapuesto.util.StringUtil;
//import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.html.HTMLDivElement;

import java.io.IOException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * Created by JAVA on 04/10/2014.
 */
public class LiveScoreHtml {

    private static final Logger LOG = LoggerFactory.getLogger(LiveScoreHtml.class);

    public static List<Fecha> downloadFecha(Liga liga) throws Exception {

        SimpleDateFormat sdf = new SimpleDateFormat("MMMMM d,yyyy", Locale.ENGLISH);
        RefreshHandler rh = new RefreshHandler() {
            public void handleRefresh(Page page, URL url, int i) throws IOException {

            }
        };

        List<Fecha> fechaList = new ArrayList<Fecha>();

        WebClient webClient = new WebClient();
        webClient.setJavaScriptEnabled(false);
        webClient.setThrowExceptionOnFailingStatusCode(false);
        LOG.info("downloadFecha url " + liga.getUrl_campeonato());
//        HtmlPage mainPage = webClient.getPage(StringUtils.replace(liga.getUrl_campeonato(),"7","30"));
        HtmlPage mainPage = webClient.getPage(liga.getUrl_campeonato());
//        HtmlPage mainPage = webClient.getPage("http://www.livescore.com/soccer/argentina/primera-division/results/all/");
        HtmlTable detalleTable = null;

        HtmlDivision divContent = HtmlUtil.getHtmlDivWithClass(mainPage, "content", 0);

        DomNodeList<DomNode> rows = divContent.getChildNodes();
        Date lastFecha = null;
        for (DomNode detailDataRow : rows) {
            if (!(detailDataRow instanceof HtmlDivision)) continue;
            Fecha fecha = new Fecha();
            fecha.setLiga(liga.getNombre());
            if ("row row-tall bt0".equals(StringUtil.trim(((HtmlDivision) detailDataRow).getAttribute("class")))) {
                lastFecha = (sdf.parse(StringUtil.trim(detailDataRow.getChildNodes().get(0).getTextContent()) + ",2015"));
                continue;
            } else if (
                    "row-gray even".equals(StringUtil.trim(((HtmlDivision) detailDataRow).getAttribute("class"))) ||
                            "row-gray".equals(StringUtil.trim(((HtmlDivision) detailDataRow).getAttribute("class")))
                    ) {
                fecha.setFecha(lastFecha);
                DomNodeList<DomNode> partidoList = ((HtmlDivision) detailDataRow).getChildNodes();

                if (!"FT".equals(StringUtil.trim(((HtmlDivision) partidoList.get(0)).getTextContent()))) {
                    LOG.info("continue " + StringUtil.trim(((HtmlDivision) partidoList.get(0)).getTextContent()));
                    continue;
                }

                fecha.setEquipo1(StringUtil.trim(((HtmlDivision) partidoList.get(1)).getTextContent()));
                fecha.setEquipo2(StringUtil.trim(((HtmlDivision) partidoList.get(3)).getTextContent()));
                fecha.setResultadoFinal(StringUtil.trim(((HtmlDivision) partidoList.get(2)).getTextContent()));

                LOG.info("liga " + liga.getNombre() + " fecha " + lastFecha + " " + fecha.getEquipo1() + " - " + fecha.getEquipo2());

                WebClient webClientEquipo = new WebClient();
                webClientEquipo.setRefreshHandler(rh);
                webClientEquipo.setJavaScriptEnabled(false);
                webClientEquipo.setThrowExceptionOnFailingStatusCode(false);
                if (((HtmlDivision) partidoList.get(2)).getHtmlElementsByTagName("a").size() > 0) {

                    HtmlPage mainPageEquipo = webClientEquipo.getPage("http://www.livescore.com" + ((HtmlDivision) partidoList.get(2)).getHtmlElementsByTagName("a").get(0).getAttribute("href"));
                    HtmlDivision mainPageEquipoDetalle = null;
                    try {
                        mainPageEquipoDetalle = HtmlUtil.getHtmlDivWithClass(mainPageEquipo, "sco", 1);
                    } catch (Exception ex) {
                        LOG.error("Error en " + "http://www.livescore.com" + ((HtmlDivision) partidoList.get(2)).getHtmlElementsByTagName("a").get(0).getAttribute("href"));
                    }
                    if (mainPageEquipoDetalle != null) {
                        String result = mainPageEquipoDetalle.getTextContent();
                        fecha.setPrimerTiempo(result.substring(1, result.length() - 1));
                    } else {
                        fecha.setPrimerTiempo(fecha.getResultadoFinal());
                    }
                } else {
                    fecha.setPrimerTiempo(fecha.getResultadoFinal());
                }
                if (org.apache.commons.lang.StringUtils.isBlank(fecha.getPrimerTiempo())) {
                    fecha.setPrimerTiempo(fecha.getResultadoFinal());
                }
                LOG.info("agregando liga " + liga.getNombre() + " fecha " + new SimpleDateFormat("dd/MM/yyyy").format(lastFecha) + " " + fecha.getEquipo1() + " - " + fecha.getEquipo2());
                fechaList.add(fecha);
            }
        }
        LOG.info("Total de fechas " + fechaList.size());
        return fechaList;
    }

    public static List<Pronostico> downloadPredictz(String url) throws Exception {

        List<Pronostico> resultadoList = new ArrayList<Pronostico>();

        WebClient webClient = new WebClient();
        webClient.setJavaScriptEnabled(false);
        webClient.setThrowExceptionOnFailingStatusCode(false);
        HtmlPage mainPage = webClient.getPage(url);
        HtmlTable detalleTable = null;

        HtmlDivision divContent = HtmlUtil.getHtmlDivWithClass(mainPage, "indexpredleaguebox", 0);
        Date hoy = DateUtil.truncDay(new Date());

        DomNodeList<DomNode> rows = divContent.getChildNodes();
        Pronostico pronostico = null;
        String liga = "";
        int i = 0;
        for (DomNode detailDataRow : rows) {
            i++;
            if (i == 1) continue;

            String styleClass = StringUtil.trim(((HtmlDivision) detailDataRow).getAttribute("class"));
            if (!("indexpredrow".equals(styleClass) || "indexpredrow oddgrayrow".equals(styleClass))) {
                continue;
            }
            pronostico = new Pronostico();
            DomNodeList<DomNode> childNodeList = detailDataRow.getChildNodes();

            try {
                String equipos = childNodeList.get(1).getTextContent();
                if (equipos.split("\\ v").length != 2) {
                    System.out.println(equipos);
                    continue;
                }

                pronostico.setFecha(hoy);
                pronostico.setEquipo1(equipos.split("\\ v")[0].trim());
                pronostico.setEquipo2(equipos.split("\\ v")[1].trim());
                pronostico.setResultado((childNodeList.get(5).getChildNodes().get(0).getTextContent()));
                pronostico.setTipo("PREDICTZ");
                resultadoList.add(pronostico);
            } catch (Throwable e) {
                e.printStackTrace();
                System.out.println("Error");
            }


        }

        LOG.info("Total de pronosticos " + resultadoList.size());
        return resultadoList;
    }

    public static List<Pronostico> downloadWinDrawWin(String url) throws Exception {

        List<Pronostico> resultadoList = new ArrayList<Pronostico>();

        WebClient webClient = new WebClient();
        webClient.setJavaScriptEnabled(false);
        webClient.setThrowExceptionOnFailingStatusCode(false);
        LOG.info("Download from windrawwin " + url);
        HtmlPage mainPage = webClient.getPage(url);
        HtmlTable detalleTable = null;

        HtmlDivision divContent = HtmlUtil.getHtmlDivWithClass(mainPage, "bx w100p", 0);

        DomNodeList<DomNode> rows = divContent.getChildNodes();
        Pronostico pronostico = null;
        String liga = "";
        int i = 0;
        int j = 0;
        Date hoy = DateUtil.truncDay(new Date());
        for (DomNode detailDataRow : rows) {
            i++;
            if (i == 1) continue;

            String styleClass = StringUtil.trim(((HtmlDivision) detailDataRow).getAttribute("class"));
            if ("bxttl mt10 mb10".equals(styleClass)) {

                liga= detailDataRow.getChildNodes().get(2).getTextContent();
//                System.out.println(detailDataRow.getTextContent());
            } else if ("lstab tah12 w900 mtb110 lstabbdr1".equals(styleClass)) {

                List<DomNode> rowsChild = detailDataRow.getChildNodes();
                for (DomNode itemRow : rowsChild) {
                    String rowClass = StringUtil.trim(((HtmlDivision) itemRow).getAttribute("class"));
                    if (rowClass.startsWith("lsrow") && itemRow.getChildNodes().size() > 14) {
                        try {
                            j++;
                            String equipos = itemRow.getChildNodes().get(1).getTextContent();
                            if (equipos.split("\\ v").length != 2) {
                                System.out.println("Error"+equipos);
                                continue;
                            }
                            pronostico = new Pronostico();
                            pronostico.setLiga(liga);
                            pronostico.setResultado(itemRow.getChildNodes().get(14).getTextContent());
                            pronostico.setFecha(hoy);
                            pronostico.setEquipo1(equipos.split("\\ v")[0].trim());
                            pronostico.setEquipo2(equipos.split("\\ v")[1].trim());
                            pronostico.setTipo("WINDRAWWIN");

                            resultadoList.add(pronostico);

                        } catch (Throwable e) {
                            e.printStackTrace();
                            System.out.println("Error");
                        }
                    }

                }

            }
        }

        Set<Pronostico> s=new HashSet<Pronostico>(resultadoList);
        LOG.info("Total de pronosticos " + s.size());
        for (Pronostico next : s) {
            LOG.info(next.getLiga()+"<>"+next.getEquipo1()+"-"+next.getEquipo2());
        }
        return resultadoList;
    }

    public static List<Fecha> downloadHoy(Map<String, String> leagueNameId) throws Exception {


        RefreshHandler rh = new RefreshHandler() {
            public void handleRefresh(Page page, URL url, int i) throws IOException {

            }
        };

        List<Fecha> fechaList = new ArrayList<Fecha>();

        WebClient webClient = new WebClient();
        webClient.setRefreshHandler(rh);
        webClient.setJavaScriptEnabled(false);
        webClient.setThrowExceptionOnFailingStatusCode(false);

        HtmlPage mainPage = webClient.getPage("http://www.livescore.com/");


        HtmlDivision divContent = HtmlUtil.getHtmlDivWithClass(mainPage, "content", 0);
        SimpleDateFormat sdf = new SimpleDateFormat("MMMMM d,yyyy", Locale.ENGLISH);

        DomNodeList<DomNode> rows = divContent.getChildNodes();
        Date lastFecha = null;
        String liga = null;
        for (DomNode detailDataRow : rows) {
            if (!(detailDataRow instanceof HtmlDivision)) continue;

            Fecha fecha = new Fecha();
            //England - Premier League  February 8
            if ("row row-tall mt4".equals(StringUtil.trim(((HtmlDivision) detailDataRow).getAttribute("class")))) {
//                lastFecha = (sdf.parse(StringUtil.trim(detailDataRow.getChildNodes().get(0).getTextContent()) + ",2015"));
                String titulo = detailDataRow.getChildNodes().get(0).getTextContent();
                LOG.info("Analizando nueva tabla " + titulo + " ");
                String[] tokens = titulo.split("\\s+");
                int total = tokens.length;
                if (total < 4) break;
                StringBuilder ligaStr = new StringBuilder();
                for (int t = 0; t < tokens.length; t++) {
                    if (t < total - 2) {
                        ligaStr.append(tokens[t]);
                    }
                }
                liga = leagueNameId.get(ligaStr.toString());

                lastFecha = DateUtil.truncDay(new Date());
            } else if (
                    "row-gray even".equals(StringUtil.trim(((HtmlDivision) detailDataRow).getAttribute("class"))) ||
                            "row-gray".equals(StringUtil.trim(((HtmlDivision) detailDataRow).getAttribute("class")))
                    ) {
                if (org.apache.commons.lang.StringUtils.isBlank(liga)) continue;

                fecha.setLiga(liga);
                fecha.setFecha(lastFecha);
                DomNodeList<DomNode> partidoList = ((HtmlDivision) detailDataRow).getChildNodes();

                if (!"FT".equals(StringUtil.trim(((HtmlDivision) partidoList.get(0)).getTextContent()))) {
                    LOG.info("continue " + StringUtil.trim(((HtmlDivision) partidoList.get(0)).getTextContent()));
                    continue;
                }

                fecha.setEquipo1(StringUtil.trim(((HtmlDivision) partidoList.get(1)).getTextContent()));
                fecha.setEquipo2(StringUtil.trim(((HtmlDivision) partidoList.get(3)).getTextContent()));
                fecha.setResultadoFinal(StringUtil.trim(((HtmlDivision) partidoList.get(2)).getTextContent()));

//                LOG.info("liga " + liga.getNombre() + " fecha " + lastFecha + " " + fecha.getEquipo1() + " - " + fecha.getEquipo2());

                WebClient webClientEquipo = new WebClient();
                webClientEquipo.setRefreshHandler(rh);
                webClientEquipo.setJavaScriptEnabled(false);
                webClientEquipo.setThrowExceptionOnFailingStatusCode(false);
                if (((HtmlDivision) partidoList.get(2)).getHtmlElementsByTagName("a").size() > 0) {

                    HtmlPage mainPageEquipo = webClientEquipo.getPage("http://www.livescore.com" + ((HtmlDivision) partidoList.get(2)).getHtmlElementsByTagName("a").get(0).getAttribute("href"));
                    HtmlDivision mainPageEquipoDetalle = null;
                    try {
                        mainPageEquipoDetalle = HtmlUtil.getHtmlDivWithClass(mainPageEquipo, "sco", 1);
                    } catch (Exception ex) {
                        LOG.error("Error en " + "http://www.livescore.com" + ((HtmlDivision) partidoList.get(2)).getHtmlElementsByTagName("a").get(0).getAttribute("href"));
                    }
                    if (mainPageEquipoDetalle != null) {
                        String result = mainPageEquipoDetalle.getTextContent();
                        fecha.setPrimerTiempo(result.substring(1, result.length() - 1));
                    } else {
                        fecha.setPrimerTiempo(fecha.getResultadoFinal());
                    }
                } else {
                    fecha.setPrimerTiempo(fecha.getResultadoFinal());
                }
                if (org.apache.commons.lang.StringUtils.isBlank(fecha.getPrimerTiempo())) {
                    fecha.setPrimerTiempo(fecha.getResultadoFinal());
                }
//                LOG.info("agregando liga " + liga.getNombre() + " fecha " + lastFecha + " " + fecha.getEquipo1() + " - " + fecha.getEquipo2());
                fechaList.add(fecha);
            }


        }


        return fechaList;
    }

    public static void main(String[] args) throws Exception {

        String[] t = "Melbourne Victory vCentral Coast Mariners".split("\\ v");
        System.out.println(Arrays.asList(t));
//        System.out.println(Arrays.asList(t));
        List<Pronostico> pronosticoList = LiveScoreHtml.downloadWinDrawWin("http://www.windrawwin.com/predictions/today/");
        for (Pronostico pronostico : pronosticoList) {
            System.out.println(pronostico);
        }
//        LiveScoreHtml.downloadPredictz(null);
//        SimpleDateFormat sdf = new SimpleDateFormat("EEEEE, MMMMM d,yyyy", Locale.ENGLISH);
//        System.out.println(sdf.format(new Date()));
//        System.out.println(sdf.parse(org.apache.commons.lang.StringUtils.replace("Sunday, April 26th, 2015","th","")));
//
    }
}
